﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public partial class Customers : ISetChangedUser, IGetNamesValues, IGetKeyValue
    {
        

        public List<AgreementElements> AgreementsElements
        {
            get
            {
                var result = new List<AgreementElements>();

                foreach (LegalEntities item in LegalEntities)
                {
                    if (item.ActiveAgreementElement != null)
                        result.Add(item.ActiveAgreementElement);
                }

                return result;
            }
        }


        /// <summary>
        /// Транспортные условия клиента
        /// </summary>
        public List<TransportConditions> TransportConditions
        {
            get
            {
                var result = new List<TransportConditions>();

                foreach (LegalEntities item in LegalEntities)
                {
                    result.AddRange(item.TransportConditions.ToList());
                }

                return result;
            }
        }


        /// <summary>
        /// Бонусы клиента
        /// </summary>
        public List<Bonuses> Bonuses
        {
            get
            {
                var result = new List<Bonuses>();

                foreach (LegalEntities item in LegalEntities)
                {
                    result.AddRange(item.Bonuses.ToList());
                }

                return result;
            }
        }


        /// <summary>
        /// Ценовые условия
        /// </summary>
        public List<PriceConditions> PriceConditions
        {
            get { var result = new List<PriceConditions>();
            
            foreach(var item in LegalEntities)
            {
                result.AddRange(item.PriceConditions.ToList());
            }
                return result;
            }
           
        }


        /// <summary>
        /// Кредитные условия
        /// </summary>
        public List<CreditConditions> CreditConditions
        {
            get { var result = new List<CreditConditions>();
            
                foreach(var item in LegalEntities)
                {
                    result.AddRange(item.CreditConditions.ToList());
                }
                return result;
            }
        } 

        /// <summary>
        /// Существует ли такой клиент в базе
        /// </summary>
        //public bool IsTheSameCustomerExists
        //{
        //    get
        //    {
        //        var col = new CustomersNamesCollection();
        //        var cust = col.CustomersNamesList.FirstOrDefault(c => c.Cities.Contains(Cities) & c.Name == Name & c.ProfineRegionNameLocalized==ProfineRegionNameLocalized);
        //        if(cust!=null)
        //            return true;
        //        return false;
        //    }
        //}
        /// <summary>
        /// Системы продуктов
        /// </summary>
        public List<ProductSystems> ProductSystems
        {
            get
            {
                var result = new List<ProductSystems>();
                var col = new CustomersProductSystemsCollection();
                foreach (CustomersProductSystems item in col.CustomersProductSystemsList)
                {
                    if (item.IdCustomer == IdCustomer)
                        if (!result.Contains(item.ProductSystems))
                            result.Add(item.ProductSystems);
                }
                return result;
            }
        }

        /// <summary>
        /// Активные реквизиты
        /// </summary>
        public List<AgreementElements> AgreementElementsActive
        {
            get
            {
                return
                    (from le in LegalEntities from item in le.AgreementElements where item.IsActive select item).ToList();
            }
        }


        ///// <summary>
        ///// Договора клиента
        ///// </summary>
        //public List<Contracts> MainContracts
        //{
        //    get { return LegalEntities.SelectMany(le => le.co).Where(s => s.IdParentContract == null).ToList(); }
        //}

        /// <summary>
        /// Pеквизиты
        /// </summary>
        public List<AgreementElements> AgreementElements
        {
            get
            {
                return (from le in LegalEntities from item in le.AgreementElements select item).ToList();
            }
        }


        /// <summary>
        /// Список городов клиента
        /// </summary>
        public string Cities
        {
            get
            {
               
                var result = new List<string>();


                foreach (LegalEntities item in LegalEntities)
                {
                    foreach (string city in item.Cities)
                    {
                        if (!result.Contains(city))
                        {
                            result.Add(city);
                        }
                    }
                }

                //List<LegalEntities> les = DB.Entities.LegalEntities.Where(c => c.IdCustomer == IdCustomer).ToList();
                //foreach(var le in les)
                //{
                //    foreach(var city in DB.Entities.Settlements.fi)
                //}


                string resultString = "";
                foreach (string item in result)
                {
                    resultString = resultString + " " + item;
                }
               
                return resultString;
            }
        }

      

        /// <summary>
        /// Менеджер
        /// </summary>
        public string Manager
        {
            get
            {
                if (IdManager != null)
                {
                  //  var col = new UsersCollection();
                    Users user = DB.Entities.Users.Find((int) IdManager);
                    if (user != null) return user.GetLocalizedName();
                }
                return "-";
            }
        }


        /// <summary>
        /// Продажи клиента
        /// </summary>
        public List<Turnovers> Sales
        {
            get
            {
                var result = new List<Turnovers>();
                foreach (LegalEntities le in LegalEntities)
                {
                    result.AddRange(le.Sales);
                }
                return result;
            }
        }

        /// <summary>
        /// Список адресов клиента
        /// </summary>
        public List<Addresses> Addresses
        {
            get { return LegalEntities.SelectMany(legalEntity => legalEntity.Addresses).ToList(); }
        }

        /// <summary>
        /// Классификация клиента по отношонеию к профайн
        /// </summary>
        public string CustomerClassificationsProfineName
        {
            get
            {
                if (IdCustomerClassificationsProfine != null)
                {
                    var col = new CustomerClassificationsProfineCollection();
                    var item = (CustomerClassificationsProfine) col.GetItemById((int) IdCustomerClassificationsProfine);

                    if (item != null)
                    {
                        switch (DB.CurrentLanguage)
                        {
                            case CurrentLanguage.Russian:
                                return item.NameRu;
                                break;
                            case CurrentLanguage.English:
                                return item.NameEn;
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    }
                }
                return "";
            }
        }

        /// <summary>
        /// Классификация клиента по бизнесу
        /// </summary>
        public string CustomerClassificationsByBusinessName
        {
            get
            {
                if (IdCustomerClassificationsByBusiness != null)
                {
                    var col = new CustomerClassificationsByBusinessCollection();
                    var item =
                        (CustomerClassificationsByBusiness) col.GetItemById((int) IdCustomerClassificationsByBusiness);

                    if (item != null)
                    {
                        switch (DB.CurrentLanguage)
                        {
                            case CurrentLanguage.Russian:
                                return item.NameRu;
                                break;
                            case CurrentLanguage.English:
                                return item.NameEn;
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    }
                }
                return "";
            }
        }


        /// <summary>
        /// Классификация клиента по обороту
        /// </summary>
        public string CustomerClassificationsTurnoverName
        {
            get
            {
                if (IdCustomerClassificationsTurnover != null)
                {
                  //  var col = new CustomerClassificationsTurnoverCollection();
                    //var item =
                    //    (CustomerClassificationsTurnover) col.GetItemById((int) IdCustomerClassificationsTurnover);
                    var item = DB.Entities.CustomerClassificationsTurnover.Find(IdCustomerClassificationsTurnover);

                    if (item != null)
                    {
                        switch (DB.CurrentLanguage)
                        {
                            case CurrentLanguage.Russian:
                                return item.NameRu;
                                break;
                            case CurrentLanguage.English:
                                return item.NameEn;
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    }
                }
                return "";
            }
        }


        ///// <summary>
        ///// Добавление оборудования клиенту
        ///// </summary>
        ///// <param name="eq2add">Оборудование для добавления</param>
        ///// <param name="userId">Логин пользователя, который собирается добавить</param>
        //public void AddEquipment(CustomersEquipments eq2add, string userId)
        //{

        //    DB.CustomersEquipmentInsert(eq2add, userId);
        //}


        /// <summary>
        /// Контакты клиенты - только чтение
        /// </summary>
        public List<Contacts> Contacts
        {
            get
            {
                var result = new List<Contacts>();
                foreach (LegalEntities legalEntity in LegalEntities.Where(p => p.IsActive))
                {
                    result.AddRange(legalEntity.Contacts);
                }
                return result;
            }
        }

        /// <summary>
        /// Является ли клиент дилером
        /// </summary>
        public bool IsDealer
        {
            get { return CustomersCollection.Dealers.Contains(this); }
        }


        ///// <summary>
        ///// Удаление юридического лица
        ///// </summary>
        ///// <param name="legalEntities">Юридическое лицо</param>
        //public void RemoveLegalEntity(LegalEntities legalEntities)
        //{
        //    LegalEntities le = LegalEntities.Single(p => p.IdLegalEntity == legalEntities.IdLegalEntity);
        //    DB.Entities.LegalEntities.Remove(le);
        //    DB.Save();
        //}

        //public void AddLegalEntity(LegalEntities legalEntities, string userLoginName)
        //{
        //    legalEntities.IdCustomer = IdCustomer;
        //    legalEntities.Customers = DB.GetCustomerById(IdCustomer);
        //    legalEntities.IdUser = userLoginName;

        //    legalEntities.IsActive = true;
        //    LegalEntities.Add(legalEntities);

        //    DB.Entities.LegalEntities.Add(legalEntities);
        //    // LegalEntities.Add(legalEntities);
        //    DB.Save();
        //}

        ///// <summary>
        ///// Добавление контакта к юридическому лицу
        ///// </summary>
        ///// <param name="contact">Контакт</param>
        ///// <param name="idLeggalEntity">Идентификатор юридического лица</param>
        ///// <param name="userLogin">Логин пользователя</param>
        //public void AddContact(Contacts contact, int idLeggalEntity, string userLogin)
        //{
        //    LegalEntities le = LegalEntities.FirstOrDefault(p => p.IdLegalEntity == idLeggalEntity);
        //    contact.IdLegalEntity = idLeggalEntity;
        //    contact.IdUser = userLogin;
        //    contact.IsActive = true;
        //    if (!le.Contacts.Contains(contact))
        //        DB.Entities.Contacts.Add(contact);
        //    DB.Save();
        //}

        public string ProfineRegionNameRu
        {
            get
            {
                //if (profineRegions != null)
                //    return profineRegions.NameRu;
                if (IdprofineRegion != null)
                {
                    var col = new profineRegionsCollection();
                    return ((profineRegions) col.GetItemById((int) IdprofineRegion)).NameRu;
                }
                return "";
            }
        }

        /// <summary>
        /// Локализованное название региона профайн
        /// </summary>
        public string ProfineRegionNameLocalized
        {
            get
            {
                profineRegions profineregion = DB.Entities.profineRegions.Find(IdprofineRegion);
                if (profineregion != null)
                {
                    switch (DB.CurrentLanguage)
                    {
                        case CurrentLanguage.Russian:
                            return profineregion.NameRu;
                            break;
                        case CurrentLanguage.English:
                            return profineregion.NameEn;
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }
                }
                return "";
            }
        }

        /// <summary>
        /// Обороты клиента
        /// </summary>
        public List<Turnovers> Turnovers
        {
            get
            {
                var result = new List<Turnovers>();

                foreach (LegalEntities legalEntity in LegalEntities)
                {
                    result.AddRange(legalEntity.Turnovers);
                }
                return result;
            }
        }

        /// <summary>
        /// Регион профайн
        /// </summary>
        public profineRegions profineRegion
        {
            get
            {
                var profineRegions = new profineRegionsCollection();
                if (IdprofineRegion != null) return profineRegions.GetItemById((int) IdprofineRegion) as profineRegions;
                return null;
            }
        }

        //    /// <summary>
        //    /// Удаление оборудования
        //    /// </summary>
        //    /// <param name="item">Оборудование для удаления</param>
        //    public void RemoveEquipment(CustomersEquipments item)
        //    {
        //        DB.Entities.CustomersEquipments.Remove(
        //            DB.CustomersEquipments.FirstOrDefault(p => p.IdCustomersEquipments == item.IdCustomersEquipments));
        //        DB.Save();
        //    }

        //    /// <summary>
        //    /// Удаление контакта
        //    /// </summary>
        //    /// <param name="idContact">Идентификатор контакта</param>
        //    public void DeleteContact(int idContact)
        //    {
        //       DB.Entities.Contacts.Remove(DB.Contacts.FirstOrDefault(p=>p.IdContact==idContact));
        //        DB.Save();
        //    }

        //    /// <summary>
        //    /// Обновление адресной информации
        //    /// </summary>
        //    /// <param name="item"></param>
        //    /// <param name="userLoginName"></param>
        //    public void UpdateAddress(Addresses item, string userLoginName)
        //    {
        //        var address4Update = Addresses.FirstOrDefault(c => c.IdAddress == item.IdAddress);

        //        if(address4Update!=null)
        //        {
        //            if (item != null)
        //            {
        //                address4Update.IdAddressesItem = item.IdAddressesItem;
        //                if (!string.IsNullOrEmpty(item.Street))
        //                    address4Update.Street = item.Street;
        //                if (!string.IsNullOrEmpty(item.ZipCode)) address4Update.ZipCode = item.ZipCode;
        //                if (!string.IsNullOrEmpty(item.Fax)) address4Update.Fax = item.Fax;
        //                if (!string.IsNullOrEmpty(item.House)) address4Update.House = item.House;
        //                if (!string.IsNullOrEmpty(item.Comments)) address4Update.Comments = item.Comments;
        //                if (item.IdAddressesType>0) address4Update.IdAddressesType = item.IdAddressesType;
        //                if (item.IdLegalEntity>0) address4Update.IdLegalEntity = item.IdLegalEntity;
        //                address4Update.IdUser = userLoginName;
        //                address4Update.IsActive = true;
        //                if (!string.IsNullOrEmpty(item.Phone)) address4Update.Phone = item.Phone;
        //                address4Update.IsPrimary = item.IsPrimary;
        //                //int idAddress4Delete = 0;
        //                //foreach (var addr in address4Update.LegalEntities.Addresses.Where(addr => addr.IdUser == null).Where(addr => addr.IsActive == false))
        //                //{
        //                //    idAddress4Delete = addr.IdAddress;
        //                //    break;
        //                //}

        //                //if (idAddress4Delete != 0)
        //                //{
        //                //    DB.Entities.Addresses.Remove(DB.GetAddressById(idAddress4Delete));
        //                //}


        //                for (int i = 0; i < address4Update.LegalEntities.Addresses.Count; i++)
        //                {
        //                    var address = address4Update.LegalEntities.Addresses.ToList()[i];
        //                    if (address.IdUser == null)
        //                        if (address.IsActive == false)
        //                        {
        //                            DB.Entities.Addresses.Remove(address);
        //                        }
        //                }

        //                if(address4Update.IsPrimary==true)
        //                {
        //                    foreach(var addr in address4Update.LegalEntities.Addresses)
        //                    {

        //                        if(addr.IdAddress!=address4Update.IdAddress)
        //                        {
        //                            addr.IsPrimary = false;
        //                        }
        //                    }
        //                }

        //                if(address4Update.LegalEntities.Addresses.Count==1)
        //                    address4Update.IsPrimary = true;
        //            }


        //            DB.Save();
        //        }
        //    }

        //    /// <summary>
        //    /// Добавление адреса
        //    /// </summary>
        //    /// <param name="item">Адрес</param>
        //    /// <param name="userLoginName">Плльзователь</param>
        //    public void AddAddress(Addresses item, string userLoginName)
        //    {
        //        var address4Update = new Addresses();

        //        if (address4Update != null)
        //        {
        //            if (item != null)
        //            {
        //                address4Update.IdAddressesItem = item.IdAddressesItem;
        //                if (!string.IsNullOrEmpty(item.Street))
        //                    address4Update.Street = item.Street;
        //                if (!string.IsNullOrEmpty(item.ZipCode)) address4Update.ZipCode = item.ZipCode;
        //                if (!string.IsNullOrEmpty(item.Fax)) address4Update.Fax = item.Fax;
        //                if (!string.IsNullOrEmpty(item.House)) address4Update.House = item.House;
        //                if (!string.IsNullOrEmpty(item.Comments)) address4Update.Comments = item.Comments;
        //                if (item.IdAddressesType > 0) address4Update.IdAddressesType = item.IdAddressesType;
        //                if (item.IdLegalEntity > 0) address4Update.IdLegalEntity = item.IdLegalEntity;
        //                address4Update.IdUser = userLoginName;
        //                address4Update.IsActive = true;
        //               if(item.IsPrimary!=null) address4Update.IsPrimary = item.IsPrimary; else
        //                   address4Update.IsPrimary = false;
        //                if (!string.IsNullOrEmpty(item.Phone)) address4Update.Phone = item.Phone;

        //                //int idAddress4Delete = 0;
        //                //foreach (var addr in address4Update.LegalEntities.Addresses.Where(addr => addr.IdUser == null).Where(addr => addr.IsActive == false))
        //                //{
        //                //    idAddress4Delete = addr.IdAddress;
        //                //    break;
        //                //}
        //                //if (idAddress4Delete != 0)
        //                //{
        //                //    DB.Entities.Addresses.Remove(DB.GetAddressById(idAddress4Delete));
        //                //}

        //                if (address4Update.IsPrimary == true)
        //                {
        //                    if(address4Update.IdLegalEntity!=null)
        //                    {
        //                        if (address4Update.LegalEntities == null)
        //                            address4Update.LegalEntities = DB.GetLegalEntityById((int) address4Update.IdLegalEntity);
        //                        foreach (var addr in address4Update.LegalEntities.Addresses)
        //                        {

        //                            if (addr.IdAddress != address4Update.IdAddress)
        //                            {
        //                                addr.IsPrimary = false;
        //                            }
        //                        }
        //                    }
        //                }
        //            }

        //            DB.Entities.Addresses.Add(address4Update);

        //          //  int idAddress4Delete = 0;
        //            for (int i = 0; i < address4Update.LegalEntities.Addresses.Count; i++)
        //            {
        //                var address = address4Update.LegalEntities.Addresses.ToList()[i];
        //                if(address.IdUser==null)
        //                    if(address.IsActive==false)
        //                    {
        //                        DB.Entities.Addresses.Remove(address);
        //                    }
        //            }

        //            //foreach (var addr in address4Update.LegalEntities.Addresses.Where(addr => addr.IdUser == null).Where(addr => addr.IsActive == false))
        //            //{
        //            //    idAddress4Delete = addr.IdAddress;
        //            //    break;
        //            //}
        //            //if (idAddress4Delete != 0)
        //            //{
        //            //    DB.Entities.Addresses.Remove(DB.GetAddressById(idAddress4Delete));
        //            //}

        //            DB.Save();
        //        }
        //    }

        //    public void DeleteAddress(Addresses item, string name)
        //    {
        //        var address4Update = Addresses.FirstOrDefault(c => c.IdAddress == item.IdAddress);
        //        DB.Entities.Addresses.Remove(address4Update);

        //        DB.Save();
        //    }


        //    /// <summary>
        //    /// Добавление реквизитов юр. лицу
        //    /// </summary>
        //    /// <param name="agreementElement">Реквизиты</param>
        //    /// <param name="userLogin">Пользователь, который сделал изменения</param>
        //    public void AddAgreementElement(AgreementElements agreementElement, string userLogin)
        //    {
        //        if(agreementElement!=null)
        //        {
        //            if(agreementElement.IdLegalEntity!=0)
        //            {
        //                agreementElement.IsActive = true;
        //                DB.Entities.AgreementElements.Add(agreementElement);
        //                DB.Save();
        //            }
        //        }
        //    }


        //    /// <summary>
        //    /// Удаление реквизитов
        //    /// </summary>
        //    /// <param name="agreementElements">Реквизиты   </param>
        //    public void RemoveAgreementElement(AgreementElements agreementElements)
        //    {
        //        AgreementElements aeToDel =
        //            DB.Entities.AgreementElements.FirstOrDefault(s => s.IdAgreementElement == agreementElements.IdAgreementElement);
        //        if(aeToDel!=null)
        //        {
        //            DB.Entities.AgreementElements.Remove(aeToDel);
        //            DB.Save();
        //        }

        //    }
        //}

        /// <summary>
        /// Максимальный порядковый номер клиента
        /// </summary>
        public static int MaxCustomerSequentalNumber
        {
            get
            {
                var col = new CustomersCollection();
                return col.ActiveCustomers.Select(customer => customer.SequentialNumber).Concat(new[] {0}).Max();
            }
        }

        /// <summary>
        /// Проверяет наличие у клиента хотя бы одного правильно заполненного Юр. Лица с контактами для подачи заявки
        /// </summary>
        /// <returns></returns>
        public bool IsReadyForRequests
        {
            get
            {
                var legalEntityCol = new LegalEntitiesCollection();
                List<LegalEntities> list = legalEntityCol.GetFullDefinedLegalEntitiesByCustomerId(IdCustomer);
                return list.Count > 0;
            }
        }


        /// <summary>
        /// Контракты клиента
        /// </summary>
        public List<Contracts> Contracts
        {
            get
            {
                return
                    (from item in LegalEntities
                     from ae in item.AgreementElements
                     from contr in ae.Contracts
                     select contr).ToList();
                //var col = new ContractsCollection();
                //return col.ContractsList;
            }
        }


        #region Implementation of ISetChangedUser

        /// <summary>
        /// Установка пользователя, который сделал изменение
        /// </summary>
        /// <param name="userLogin">Логин пользователя</param>
        public void SetChangedUser(string userLogin)
        {
            if (string.IsNullOrEmpty(userLogin))
                throw new Exception("Логин пользователя не должен быть пустым");

            IdUser = userLogin;
        }

        #endregion

        /// <summary>
        /// Возвращает юридическое лицо клиента по названию
        /// </summary>
        /// <param name="legalEntityName">Название юридического лица</param>
        /// <param name="exactName"></param>
        /// <returns>Юридическое имя</returns>
        public LegalEntities GetLegalEntityByName(string legalEntityName, bool exactName = false)
        {
            if (!exactName)
            {
                return
                    LegalEntities.FirstOrDefault(
                        legalEntity => legalEntity.Name.ToUpper().Trim() == legalEntityName.ToUpper().Trim());
            }

            {
                return LegalEntities.FirstOrDefault(legalEntity => legalEntity.Name == legalEntityName);
            }
        }


        /// <summary>
        /// Получить дилера по имени
        /// </summary>
        /// <param name="name">Имя дилера</param>
        /// <returns>Результат</returns>
        public static Customers GetDealerByName(string name)
        {
            foreach (Customers item in CustomersCollection.Dealers)
            {
                if (item.Name == name)
                    return item;
                LegalEntities cust = item.LegalEntities.FirstOrDefault(c => c.Name == name);
                if (cust != null)
                    return cust.Customers;
            }

            return null;
        }

        /// <summary>
        /// Получение юридического лица по номеру в SAP
        /// </summary>
        /// <param name="legalentitySapNumber">Номер в SAP</param>
        /// <returns>Юридическое лицо</returns>
        public int GetLegalEntityBySapNumber(int legalentitySapNumber)
        {
            LegalEntities le = LegalEntities.FirstOrDefault(c => c.NumberInSAP == legalentitySapNumber);
            if (le == null)
                return 0;
            return le.IdLegalEntity;
        }

        #region Implementation of IGetNamesValues

        /// <summary>
        /// Получение списка имён
        /// </summary>
        /// <returns>Список имён</returns>
        public List<string> GetNamesValues()
        {
            var result = new List<string>();
            result.Add(Name);
            return result;
        }

        #endregion

        #region Implementation of IGetKeyValue

        /// <summary>
        /// Получение ключего значения элемента
        /// </summary>
        /// <returns>Ключевое значение</returns>
        public int GetKeyValue()
        {
            return IdCustomer;
        }

        #endregion
    }
}